home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
misc
/
prtfolio
/
sft.arj
/
SFT.I
< prev
next >
Wrap
Text File
|
1993-07-21
|
20KB
|
957 lines
/***
SFT : serial file transfer for atari portfolio
callin sequence: sft [baudrate]
terminal emulation * send file * receive file
compatible to bruce carbrey's tinyterm, ssend, sreceive
r. henze 08.12.89 (transfer.s)
last edit 21.07.93
19.07.93 Cnrtl-C/Cntrl/Break abgeschaltet (Funktion nobreak()
anwahl COM-Port ueber tmio_setup
11.06.92 Funktion redit (remote editing) eingeführt
nur für IBM-PC
09.04.92 send_com, get_com: uebertragung von cr:
(ibm-workstation rs6000 uebersetzt cr nach lf
im tastaturtreiber)
lf --> lf, lf
cr --> lf, ff
01.05.90 senden von hexfiles eingefuehrt
19.05.90 ver. 2.0: master/slave-version filetransfer, backup
01.08.90 ver. 3.0: serial port routines replaced by
interrupt driven version: tmio.asm
05.10.90 ver. 3.1: machine specific routines extracted to files:
sftata.c, sftibm.c
06.11.90 ver. 3.2: output to screen in hex code possible
logging of incoming data
09.12.90 : blockwise file-write
08.07.91 ver. 3.3: optionale verzögerung in put_com (fuer lang-
same empfänger ohne interrupt und puffer, cp/m)
***/
#define ibm 0
#define atari 1
#define machine ibm /* ibm, atari */
/*#define ptf*/ /*einschalten, falls für portfolio! */
/* ibm : tmio assembler routines, interrupt driven,
for ibm: link with : tmio_ibm.obj
portfolio: link with : tmio_ptf.obj
superchar: link with : tmio_spc.obj
*/
/* ------------------------------------------------------------------------ */
#if machine == ibm
#include <dos.h>
#include <conio.h>
#include <bios.h>
#include <dir.h>
#include <io.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#define f1 0xbb
#define f2 0xbc
#define f3 0xbd
#define f4 0xbe
#define f5 0xbf
#define f6 0xc0
#define f7 0xc1
#define f8 0xc2
#define f9 0xc3
#define f10 0xc4
#define cf1 0xde
#define cf2 0xdf
#define cf3 0xe0
#define cf4 0xe1
#define cf5 0xe2
#define cf6 0xe3
#define cf7 0xe4
#define cf8 0xe5
#define cf9 0xe6
#define cf10 0xe7
#define bufsz 0x400 /* buffer size = block size*/
#define max_retry 5
#define ack 0x06 /* ascii ack = positive acknowlege*/
#define nak 0x15
#define esc 0x1b
#define cr 0x0d
#define lf 0x0a
#define ff 0x0c
#define eot 0x04
#define xon 0x11 /*dl1*/
#define xof 0x13 /*dl3*/
#define true 1
#define false 0
#define filnamlen 14 /* laenge filename incl. ext. und laufwerkskennung*/
int xoff_flg ; /* ==1 : xoff was sent */
int chr ; /* character received*/
unsigned char keydown ; /* key pressed*/
unsigned char line[80] ; /* line buffer*/
unsigned char bcheck ; /* checksum transmitted*/
unsigned char checksum ; /* computed checksum*/
unsigned char retry ; /* retry counter*/
unsigned char buf[bufsz]; /* buffer for received data*/
unsigned char dummy;
unsigned char hexflg; /* ==true : hex output to screen */
unsigned char logflg; /* ==true : logging incoming data to file */
unsigned int blksz ; /* transmitted block size*/
unsigned int bnum ; /* transmitted block #*/
unsigned int blknum ; /* current block sequence #*/
unsigned int delay ; /* optional delay in put_com */
unsigned int com_port ; /* COM-port # (0,1) == COM1, COM2 */
int speed ; /* baudrate*/
int ser_stat ; /* status serial port */
int cbuf_ful ; /* flag serial port buffer full*/
int i ; /* buffer index*/
int file ; /* file handle for output*/
int scratch;
static int baudlist[]=
110,150,300,600,1200,2400,4800,9600,0
;
#ifndef ptf
char *args[] = { " ", " ", NULL };
unsigned char ediflg;
unsigned char recflg;
unsigned char scr[80];
#endif
extern void nobreak();
extern int get_ctc();
/* ------------------------------------------------------------------------ */
/*** Pre-references ***/
void quit(char* msg);
unsigned char get_com_chk(unsigned char* csum);
void put_com (unsigned char chr);
/*------------------------------------------------------------------------- */
/* ----- error messages and string constants ------------------------------ */
/*------------------------------------------------------------------------- */
#include <sftgmes.c>
/*------------------------------------------------------------------------- */
/* ----- machine scpecific code ------------------------------------------- */
/*------------------------------------------------------------------------- */
#if machine == atari
#include <osbind.h>
#include <sftata.c>
#endif
/*------------------------------------------------------------------------- */
#if machine == ibm
#include <sftibm.c>
#endif
/*------------------------------------------------------------------------- */
/* ----- end of machine scpecific code ----------------------------------- */
/*------------------------------------------------------------------------- */
void getname(line)
unsigned char *line;
{
int i;
unsigned char c;
i=0;
do
c = conin();
if (c == 0x08 && i>0)
conout(c);
i--;
else
if(i<filnamlen && c!= cr)
*(line+i) = c;
conout(c);
i++;
while(c != 0x0d);
*(line+i) = 0;
conout(cr);
conout(lf);
}
/*----------------------------------------------------------------------------*/
/*ringpuffer-routinen*/
#define rbuflen 0x8000 /*pufferlaenge 32 kByte*/
unsigned char rbuf[rbuflen]; /*puffer*/
unsigned short staptr; /*startpointer*/
unsigned short endptr; /*endpointer*/
unsigned short chrnum; /*aktuelle pufferlaenge*/
/*---------------------------------------*/
int tobuf(ib)
unsigned char ib;
{
if (chrnum < rbuflen) /*puffer nicht voll?*/
rbuf[endptr]=ib;
if (endptr < rbuflen-1)
endptr++;
else
endptr=0;
chrnum++;
return true;
else /*puffer voll*/
logflg = false;
return false;
}
/*---------------------------------------*/
int frombuf(ib)
unsigned char *ib;
{
if (chrnum > 0) /*puffer nicht leer?*/
*ib = rbuf[staptr];
if (staptr < rbuflen-1)
staptr++;
else
staptr=0;
chrnum--;
return true;
else
return false;
}
/*---------------------------------------*/
void bufini()
{
staptr=0;
endptr=0;
chrnum=0;
}
/*---------------------------------------*/
void savebuf()
{
unsigned char ib;
put(m_filename);
getname(line);
file = out_open(line);
if (file != -1)
while (chrnum > 0)
if (frombuf(&ib))
write(file,&(unsigned char)ib,1);
close(file);
put(m_file);
put(line);
put(m_closed);
}
/*---------------------------------------*/
void showbuf()
{
unsigned short wptr;
unsigned short wnum;
unsigned char ib;
wnum = chrnum;
wptr = staptr; /*staptr und chrnum retten*/
while(frombuf(&ib) || kbhit())
conout(ib);
chrnum = wnum;
staptr = wptr; /*staptr und chrnum restaurieren*/
}
/*----------------------------------------------------------------------------*/
void quit(msg)
char *msg;
{
exit_com();
close(file);
put(nl);
put(msg);
exit (1);
}
/* ------------------------------------------------------------------------ */
void wait(delay)
unsigned int delay;
unsigned int i;
unsigned int k;
for (i=0; i<delay; i++)
k=i;
i=k;
/* ------------------------------------------------------------------------ */
/* display serial status*/
void show_port_error(message,i)
unsigned char *message;
int i;
{
put(nl);
put(message);
put(m_stat);
hex(i);
}
/* ------------------------------------------------------------------------ */
unsigned char get_com_chk(csum)
/* wait for byte from aux port.
return data byte.
tests for <esc> key on keyboard and